/*
 *
 * Copyright (C) 2008 Jose Javier García Zornoza.
 * 
 * Este es un programa libre; puedes distribuirlo y/o modificarlo bajo
 * los términos de la versión 2 (o cualquier versión posterior) de la Licencia 
 * Pública General de la Fundación de Software Libre.
 * Este programa se distribuye con la esperanza  de poder ser útil, pero sin
 * NINGUNA GARANTIA; tampoco la garantía implícita de COMERCIALIZACION o DEDICACIÓN
 * A UN PROPOSITO PARTICULAR. Ver la licencia GNU GPL para más detalles.
 * Deberías haber recibido una copia de la licencia GNU GPL con este programa;
 * en caso contrario puedes obtener una copia visitando el sitio web www.fsf.org
 * o escribiendo a la Fundación de Software Libre, Inc., 59 Temple 
 * Place - Suite 330, Boston, MA  02111-1307, USA. 
 *
 */
package org.gruposp2p.dnie.utils;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.xml.security.utils.Base64;

public class FileUtils {

    private static Logger logger =
            LoggerFactory.getLogger(FileUtils.class);


    public static String TEMPDIR =  System.getProperty("java.io.tmpdir");
    public static String BASEDIR =  System.getProperty("user.home");
    public static String APPDIR =  FileUtils.BASEDIR + File.separator +
             "DNIeFirma";
    public static String PROPERTIES_FILE =
            APPDIR  + File.separator + "app.properties";
    public static String DATE_SYSTEM_BASEDIR =
            APPDIR + File.separator + "DATE_SYSTEM_BASEDIR";
    public static String UUID_SYSTEM_BASEDIR =
            APPDIR + File.separator +"UUID_SYSTEM_BASEDIR";
    public static String XML_FILE_EXTENSION = "xml";
    
    public static File copyFromStreamToFile (InputStream is, File file) {
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(file);
            byte[] buf = new byte[1024];
            int len;
            while ((len = is.read(buf)) >0) {
                out.write(buf, 0, len);
            }

        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        } finally {
            try {
                is.close();
                out.close();
            } catch (IOException ex) {
                logger.error(ex.getMessage(), ex);
            }
        }
        return file;
    }

    /**
     * Crea un fichero con la extensión indicada por el parámetro <code>fileExtension</code>
     * en la ruta calculada en función de los parámetros <code>documentUUID</code> y
     * <code>documentDate</code>. La ruta vendrá determinada por el método <code>
     * DateUtils.getFilesystemPathFromDate</code>
     * @param documentUUID
     * @param documentDate
     * @param fileExtension
     * @return
     */
    public static File getEmptyDocumentFile(String documentUUID, Date documentDate,
    	String fileExtension) throws IOException {
        String fileDirPath = DATE_SYSTEM_BASEDIR
        	+ DateUtils.getFilesystemPathFromDate(documentDate);
        new File(fileDirPath).mkdirs();
        File emptyDocumentFile = new File(fileDirPath + documentUUID + fileExtension);
        emptyDocumentFile.createNewFile();
        return emptyDocumentFile;
    }

    public static void copyInputstreamToFile (InputStream in, OutputStream out) {
        try {
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        } catch (IOException ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
    
    public static void copyFileToFile (File fileFrom, File fileTo) {
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream(fileFrom);
            out = new FileOutputStream(fileTo);
            copyInputstreamToFile (in, out);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
    
    public static byte[] readFile(String filename) throws IOException {
        File file = new File(filename);
        return readFile(file);
    }
    
    public static byte[] readFile(File file) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new
            FileInputStream(file));
        int bytes = (int) file.length();
        byte[] buffer = new byte[bytes];
       
        int readBytes = bis.read(buffer);
        bis.close();
        return buffer;
    }
    
    public static String encodeFileBase64 (File file) throws IOException {
        String archivoBase64 = null;  
        byte[] bytesZip =  FileUtils.readFile(file);
        archivoBase64 = new String(Base64.encode(bytesZip)); 
        return archivoBase64;
    }
    /*
    public static File decodeFileBase64 (String archivoCodificado) throws IOException {
        File archivoFile = null;
        byte[] archivoBytes = archivoCodificado.getBytes();
        archivoFile = File.createTempFile("temp", ".zip");
        //byte[] archivoDecodificado = (byte[]) Base64.decode(archivoBytes);
        BufferedOutputStream bos = new BufferedOutputStream(
            new FileOutputStream(archivoFile));
        bos.write(archivoDecodificado);
        bos.close();
        return archivoFile;
    }*/
    
     public static void save(String content, String filePath,
            String fileExtension) {
        String rutaCompletaArchivo = filePath;
        if (!(fileExtension == null || fileExtension.equals("")))
            rutaCompletaArchivo = filePath + "." + fileExtension;
        try {
            File archivoSalida = new File(rutaCompletaArchivo);
            FileWriter out = new FileWriter(archivoSalida);
            out.write(content);
            out.close();
        } catch (IOException ex) {
            logger.error(ex.getMessage(), ex);
        }        
     }
     
     public static File getFileFromString (String contenido) {
        File temp = null;
        try {
             temp = File.createTempFile("recibo", "xml");
             temp.deleteOnExit();
             BufferedWriter out = new BufferedWriter(new FileWriter(temp));
             out.write(contenido);
             out.close();
        } catch (IOException ex) {
            logger.error(ex.getMessage(), ex);
        }
        return temp;
     }

    public static String getPKCS11LibPath() {
        String[] systemLibraryList = { "/usr/lib/opensc-pkcs11.so",
            "/usr/local/lib/opensc-pkcs11.so",
            "/lib/opensc-pkcs11.so", "C:\\WINDOWS\\system32\\UsrPkcs11.dll" };

        for (String file : systemLibraryList) {
            File f = new File(file);
            if (f.exists()) {
                return f.getAbsolutePath();
            }
        }
        return null;
    }

}
